# Methods added to this helper will be available to all templates in the application.

require_dependency 'jsmin'

module ApplicationHelper

  include AppFormHelper


  #
  #=== ローカライズ文字列を返す
  #
  #指定されたメッセージ区分とメッセージコードに該当する
  #ローカライズされた文字列を返す。
  #
  def app_localized_message(msg_kbn, msg_code)
    if @app_messages_hash[msg_kbn.to_s + "_" + msg_code.to_s].nil?
      return ""
    else
      return @app_messages_hash[msg_kbn.to_s + "_" + msg_code.to_s].msg_base
    end
  end


  #
  #=== ラベル文字列タグを返す
  #
  #指定されたメッセージ区分とメッセージコードに該当する
  #ラベル文字列タグを返す。
  #
  def page_label(msg_kbn, msg_code, options = {})
    options_str = ""
    options.each_pair do |k, v|
      options_str += ' ' + k.to_s + '="' + v.to_s + '"'
    end
    return '<span '+ options_str +'>' + app_localized_message(msg_kbn, msg_code) + '</span>&nbsp;'
  end


  #
  #=== 日付入力フィールドタグを返す
  #
  #日付ピックアップダイアログのアイコンを持つ
  #日付入力フィールドのタグを出力する。
  #
  def date_pick_field(variable, attribute, options, callback="")
    return text_field( variable, attribute, options ) + 
      "&nbsp;" + 
      link_to(image_tag("icon-calendar.gif", {:alt=>app_localized_message(:label, :icon_date_pick), :border => 0} ), "javascript:objDatepick.show('" + variable.to_s + "_" + attribute.to_s + "', '"+callback+"');" )
  end


  #
  #=== 時刻選択フィールドタグを返す
  #
  #時刻選択フィールドのタグを出力する。
  #
  def time_select_field(variable, attribute, options)
    return datetime_select(variable, attribute, :order=>[:hour, :minute])
  end


  #
  #=== 時刻入力フィールドタグを返す
  #
  #時刻入力フィールドのタグを出力する。
  #
  def time_text_field(variable, attribute, options)
    year = Time.now.year.to_s # ダミー値
    month = Time.now.month.to_s # ダミー値
    day = Time.now.day.to_s # ダミー値
    hour = ""
    minute = ""
    if (obj = instance_variable_get("@#{variable}"))
      if ! obj[attribute].nil?
        value  = obj[attribute]
        year   = value.year.to_s
        month  = value.month.to_s
        day    = value.day.to_s
        hour   = value.hour.to_s
        minute = value.min.to_s
      end
    end
    content_for(:for_ext_scripts) do
      'Ext.onReady(function(){ var cmp = new Ext.form.TextField({id:"'+ (variable.to_s+'_'+attribute.to_s) +'_4i"}); cmp.applyToMarkup("'+ (variable.to_s+'_'+attribute.to_s) +'_4i") ; });' + "\n" +
      'Ext.onReady(function(){ var cmp = new Ext.form.TextField({id:"'+ (variable.to_s+'_'+attribute.to_s) +'_5i"}); cmp.applyToMarkup("'+ (variable.to_s+'_'+attribute.to_s) +'_5i") ; });' + "\n"
    end

    return "<input type='hidden' id='#{variable}_#{attribute}_1i' name='#{variable}[#{attribute}(1i)]' value='#{year}'>" +
    "<input type='hidden' id='#{variable}_#{attribute}_2i' name='#{variable}[#{attribute}(2i)]' value='#{month}'>" +
    "<input type='hidden' id='#{variable}_#{attribute}_3i' name='#{variable}[#{attribute}(3i)]' value='#{day}'>" +
    "<input type='text' id='#{variable}_#{attribute}_4i' name='#{variable}[#{attribute}(4i)]' value='#{hour}' style='width:30px;ime-mode:disabled;' maxlength='2'> ： " +
    "<input type='text' id='#{variable}_#{attribute}_5i' name='#{variable}[#{attribute}(5i)]' value='#{minute}' style='width:30px;ime-mode:disabled;' maxlength='2'>"

  end


  #
  #=== 年月日選択フィールドタグを返す
  #
  #年月日選択フィールドのタグを出力する。
  #
  def ymd_select_field(variable, attribute, options)
    opt = {
      :start_year        => Time.now.year,
      :end_year          => Time.now.year - 80,
      :order             => [:year, :month, :day],
      :discard_hour      => 1,
      :use_month_numbers => true
    }
    return datetime_select(variable, attribute, opt)
  end


  #
  #=== カレンダー日付ピックアップダイアログ用レイヤタグを返す
  #
  #カレンダー日付ピックアップダイアログ用のレイヤタグを出力する。
  #
  def calendar_tag
    tag = ''
    tag << '<div id="yui-calendar" style="visibility:hidden;position:absolute;z-index:10000;">'
    tag << '<div class="x-dlg-hd">カレンダー</div>'
    tag << '<div id="yui-calendar-base"></div>'
    tag << '</div>'
    tag << '</div>'

    return tag
  end


  #
  #=== コード(区分値)を指定したタグを返す
  #
  #コード(区分値)を指定したSELECTタグを出力する。
  #
  def select_for_codes(variable, attribute, codes, options, html_options)
    choices = Array.new
    codes.each do |code|
      key = app_localized_message(:label, attribute.to_s + "_" + code.to_s)
      choices.push([key, code])
    end
    select(variable, attribute, choices, options, html_options)
  end


  #
  #=== アイコンとラベルのリンクタグを返す
  #
  #アイコン画像とラベルがセットになったリンクタグを出力する。
  #
  def icon_label_link_tag(image, label, options={})
    tags = image_tag(image, {:border => 0, :align=>"absmiddle"})
    tags << '&nbsp;<span class="icon_label_link">' + label + '</span>'

    return link_to(tags, options)
  end


  #
  #=== アイコンとラベルのリンクタグを返す
  #
  #アイコン画像とラベルがセットになったJavaScript呼び出しリンクタグを出力する。
  #
  def icon_label_function_tag(image, label, jsfunction)
    tags = image_tag(image, {:border => 0, :align=>"absmiddle"})
    tags << '<span class="icon_label_link">【' + label + '】</span>'

    return link_to_function(tags, jsfunction)
  end


  #
  #=== 時刻フォーマット文字列を返す
  #
  #指定した時刻を、指定したフォーマットに変換して返す。
  #
  def fmt_time(time, format)
    if time
      case format
      when :HM
        time.strftime('%H:%M')
      when :Y2MD
        if Time.now.year == time.year
          time.strftime('%m/%d')
        else
          time.strftime('%y/%m/%d')
        end
      else
        '&nbsp;'
      end
    else
      '&nbsp;'
    end
  end


  #
  #=== エラーメッセージ文字列タグを返す
  #
  #指定されたインスタンス変数の該当属性にエラーがある場合に
  #そのエラー文字列タグを返す。
  #
  def error_message_on(object, method, prepend_text="", append_text="", css_class="formError")
    if (obj = instance_variable_get("@#{object}")) && (errors = obj.errors.on(method))
      err = errors.is_a?(Array) ? errors.first : errors

      errmsg = err.to_s
      if errmsg.index(:too_long.to_s)
        msg = sprintf( app_localized_message(:error, :too_long), errmsg.split(',')[1] )
      elsif errmsg.index(:too_short.to_s)
        msg = sprintf( app_localized_message(:error, :too_short), errmsg.split(',')[1] )
      elsif errmsg.index(:associated_invalid.to_s)
        next
      else
        msg = app_localized_message(:error, errmsg) 
      end

      message = app_localized_message(:label, method) + msg
      content_tag("div", "#{prepend_text}#{message}#{append_text}", :class => css_class)
    else 
      ''
    end
  end


  #
  #=== エラーメッセージ文字列を返す
  #
  #指定されたオブジェクトにエラーがある場合に
  #そのエラー配列を"\n"区切りの文字列で返す。
  #
  def error_message_to_string(object, mapping={}, sort=[])
    if ! object.errors.nil?
      errors = object.errors
      messages = []
      errors.each do |err|
        if sort.index(err[0]).nil? && sort.index(err[0].intern).nil?
          index = messages.size
        else
          index = sort.index(err[0]).nil? ? sort.index(err[0].intern) : sort.index(err[0])
        end

        if mapping[err[0]].nil? && mapping[err[0].intern].nil? 
          mapname = app_localized_message(:label, err[0])
        else
          mapname = mapping[err[0]].nil? ? mapping[err[0].intern] : mapping[err[0]]
        end

        errmsg = err[1].to_s
        if errmsg.index(:too_long.to_s)
          msg = sprintf( app_localized_message(:error, :too_long), errmsg.split(',')[1] )
        elsif errmsg.index(:too_short.to_s)
          msg = sprintf( app_localized_message(:error, :too_short), errmsg.split(',')[1] )
        elsif errmsg.index(:associated_invalid.to_s)
          next
        else
          msg = app_localized_message(:error, errmsg) 
        end

        messages[index] = mapname + msg
      end
      message = messages.join("\n");
      return message
    else
      ''
    end
  end
end
